home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / KEYWITCH / KW_S200.LZH / w22env.s < prev    next >
Text File  |  1995-03-20  |  55KB  |  2,089 lines

  1.     .include    w01dos.mac
  2.     .include    w04macro.mac
  3.     .include    w05reloc.mac
  4.     .include    w09mes.mac
  5.  
  6.     .text
  7.     .even
  8.  
  9. ********************************
  10. *テーブルのワークを初期化する
  11. *  スーパーバイザモードで呼び出すこと。
  12. *<a4.l:常駐していて-rが指定されていない=常駐部分のbase/その他=base
  13. *<a6.l:base
  14. *?d0/a0-a1
  15. init_table_work::
  16.     move.l    a5,-(sp)
  17.     lea.l    (table_list)r,a1
  18.     move.l    (a1)+,d0
  19. init_table_work_loop::
  20.     movea.l    d0,a5
  21.     move.w    (a1)+,d0
  22.     movea.l    (a4,d0.w),a0
  23.     bsr    move_table
  24.     move.l    (a1)+,d0
  25.     bne    init_table_work_loop
  26. *
  27.     movea.l    prog_table-base(a4),a0
  28.     lea.l    (prog_table_work)r,a5
  29.     bsr    move_prog_table
  30. *
  31.     move.l    ask_flag_bits-base(a4),(ask_flag_bits_work)r
  32. *
  33.     lea.l    live_repeat_bits-base(a4),a0
  34.     lea.l    (live_repeat_bits_work)r,a5
  35.  .rept 16/4
  36.     move.l    (a0)+,(a5)+
  37.  .endm
  38. *
  39.     lea.l    kill_repeat_bits-base(a4),a0
  40.     lea.l    (kill_repeat_bits_work)r,a5
  41.  .rept 16/4
  42.     move.l    (a0)+,(a5)+
  43.  .endm
  44. *
  45.     lea.l    led_map-base(a4),a0
  46.     lea.l    (led_map_work)r,a5
  47.     moveq.l    #7-1,d0
  48. @@:    move.b    (a0)+,(a5)+
  49.     dbra    d0,@b
  50. *
  51.     lea.l    joy1_map-base(a4),a0
  52.     lea.l    (joy1_map_work)r,a5
  53.     moveq.l    #8-1,d0
  54. @@:    move.b    (a0)+,(a5)+
  55.     dbra    d0,@b
  56. *
  57.     lea.l    joy2_map-base(a4),a0
  58.     lea.l    (joy2_map_work)r,a5
  59.     moveq.l    #8-1,d0
  60. @@:    move.b    (a0)+,(a5)+
  61.     dbra    d0,@b
  62. *
  63.     movea.l    (sp)+,a5
  64.     rts
  65.  
  66. ********************************
  67. *テーブルをワークから常駐部分に戻す
  68. *  スーパーバイザモードで呼び出すこと。
  69. *<a5.l:常駐部分のbase
  70. *<a6.l:base
  71. *?d0-d1/a0-a2
  72. renew_table_work::
  73. *テーブルのサイズの合計を求める
  74.     lea.l    (prog_table_work-22)r,a0
  75. @@:    lea.l    22(a0),a0
  76.     tst.w    (a0)+
  77.     bne    @b
  78.     lea.l    (prog_table_work)r,a1
  79.     suba.l    a1,a0
  80.     move.l    a0,d1            *プログラム名のテーブルのサイズ
  81.     lea.l    (table_list)r,a1
  82.     move.l    (a1)+,d0
  83. renew_table_work_1::
  84.     movea.l    d0,a0
  85.     bsr    get_table_size
  86.     add.l    d0,d0
  87.     addq.l    #2,d0            *エンドコードの分
  88.     add.l    d0,d1
  89.     addq.w    #2,a1
  90.     move.l    (a1)+,d0
  91.     bne    renew_table_work_1
  92.     di                *割り込み禁止
  93. *常駐部分に入り切るかどうか確認する
  94. *<d1.l:テーブルのサイズの合計
  95.     lea.l    (keep_tail)rr,a1    *常駐データの先頭
  96.     tst.b    (device_flag)rr
  97.     beq    renew_table_work_2    *デバイスドライバではない
  98.     lea.l    (a1,d1.l),a0
  99.     move.l    (device_end)rr,a2    *デバイスの末尾
  100.     cmpa.l    a2,a0
  101.     bhi    renew_table_work_3    *入り切らない
  102.     bra    renew_table_work_5    *入り切る
  103.  
  104. *必要な大きさに変更する
  105. renew_table_work_2::
  106.     move.l    d1,d0
  107.     add.l    #keep_tail-(prog_head-$F0),d0
  108.     move.l    d0,-(sp)
  109.     pea.l    (prog_head-$F0)rr
  110.     DOS    _SETBLOCK
  111.     addq.w    #8,sp
  112.     tst.l    d0
  113.     bpl    renew_table_work_5    *入り切る
  114. *ぎりぎりまで縮小する
  115.     move.l    #keep_tail-(prog_head-$F0),-(sp)
  116.     pea.l    (prog_head-$F0)rr
  117.     DOS    _SETBLOCK
  118.     addq.w    #8,sp
  119. *別の領域を確保する
  120. renew_table_work_3::
  121.     move.l    (alloc_point)rr,d0
  122.     beq    renew_table_work_4    *アロケートされていない
  123.     move.l    d0,-(sp)        *アロケートされていた領域を開放
  124.     DOS    _MFREE
  125.     addq.w    #4,sp
  126. renew_table_work_4::
  127.     lea.l    (prog_head-$100)r,a0
  128.     move.l    a0,d0
  129. @@:    movea.l    d0,a0
  130.     move.l    4(a0),d0        *Humanのメモリ管理ポインタを探す
  131.     bne    @b
  132.     pea.l    16(a0)
  133.     DOS    _VERNUM
  134.     cmp.w    #$0300,d0
  135.     bcc    1f
  136.     DOS    _SETPDB~0
  137.     bra    2f
  138. 1:    DOS    _SETPDB            *プロセス管理を移す
  139. 2:    move.l    d1,-(sp)        *必要なメモリを確保
  140.     DOS    _MALLOC
  141.     move.l    d0,(alloc_point)rr
  142.     movea.l    d0,a1
  143.     pea.l    (prog_head-$F0)r
  144.     DOS    _VERNUM
  145.     cmp.w    #$0300,d0
  146.     bcc    1f
  147.     DOS    _SETPDB~0
  148.     bra    2f
  149. 1:    DOS    _SETPDB            *プロセス管理を元に戻す
  150. 2:    lea.l    12(sp),sp
  151.     bra    renew_table_work_6
  152.  
  153. renew_table_work_5::
  154.     move.l    (alloc_point)rr,d0
  155.     beq    renew_table_work_6    *アロケートされていない
  156.     move.l    d0,-(sp)        *アロケートされていた領域を開放
  157.     DOS    _MFREE
  158.     addq.w    #4,sp
  159.     clr.l    (alloc_point)rr
  160. *<a1.l:データを書き込む領域
  161. renew_table_work_6::
  162.     movem.l    a4/a5,-(sp)
  163.     movea.l    a5,a4
  164.     movea.l    a1,a5
  165.     lea.l    (prog_table_work)r,a0
  166.     bsr    move_prog_table
  167.     lea.l    (table_list)r,a1
  168.     move.l    (a1)+,d0
  169. renew_table_work_loop::
  170.     movea.l    d0,a0
  171.     move.w    (a1)+,d0
  172.     move.l    a5,(a4,d0.w)
  173.     bsr    move_table
  174.     move.l    (a1)+,d0
  175.     bne    renew_table_work_loop
  176.     bsr    trans_tables2
  177.     movem.l    (sp)+,a4/a5
  178.     ei                *割り込み許可
  179.     rts
  180.  
  181. ********************************
  182. *環境定義ファイルを読み込む
  183. *<a2.l:環境定義ファイル名の並びの先頭(ヌルならばデフォルトが使用される)
  184. *<a4.l:常駐していて-rが指定されていない=常駐部分のbase/その他=base
  185. *<a6.l:base
  186. *>d4.l:エラーなし=0/あり=メッセージの番号
  187. *z:エラーあり=0/なし=1
  188. *?d0-d7/a0-a5
  189. load_environment::
  190. *ワークエリアの初期設定
  191.     moveq.l    #0,d0
  192.     lea.l    (name_work)r,a0        *キーネームは複数のファイルにまたがる
  193.     move.b    d0,(a0)
  194.     move.l    a0,(last_name_tail)r    *キーネームの並びの末尾
  195. *ファイルの読み込み
  196. load_file_loop::
  197. *&ruleと&targetは複数のファイルをまたがない
  198.     moveq.l    #0,d0
  199.     move.b    d0,(rule_set)r        *&ruleを設定したか
  200.     move.w    d0,(target_count)r    *&targetの長さ
  201. *環境定義ファイル名をワークにコピーする
  202.     lea.l    (env_name_work)r,a3    *環境定義ファイル名のワーク
  203.     movea.l    a3,a0
  204.     tst.b    (a2)
  205.     bne    load_name_2        *環境定義ファイル名が指定されている
  206.     lea.l    (exec_directory)r,a1    *起動ディレクトリ
  207.     lea.l    (default_env_name)r,a2    *デフォルトの環境定義ファイル名
  208. load_name_1::
  209.     move.b    (a1)+,(a0)+
  210.     bne    load_name_1
  211.     subq.w    #1,a0
  212. load_name_2::
  213.     move.b    (a2)+,(a0)+
  214.     bne    load_name_2
  215. *環境定義ファイル名のアドレスを保存する
  216. *<a2.l:次の環境定義ファイル名
  217.     move.l    a2,(next_name_ptr)r
  218. *環境定義ファイルをオープンする
  219. *<a3.l:環境定義ファイル名のワーク
  220.     lea.l    (env_var_name)r,a1    *環境変数名
  221.     lea.l    (rdc_work)r,a5        *ファイル読み込みバッファの先頭
  222.     bsr    open_file
  223.     bmi    load_opn_err        *オープンできない
  224. *読み込み前の初期設定
  225.     moveq.l    #0,d5            *エラーカウンタ
  226.     moveq.l    #1,d6            *行番号
  227.     lea.l    (rds_work)r,a4        *1行読み込みワークの先頭
  228. *    lea.l    (rdc_work)r,a5        *ファイル読み込みバッファの先頭
  229. *読み込みループ
  230. *<d5.l:下位ワード=エラーカウンタ,ファイルエンドならば最上位ビット=1
  231. *<d6.w:行番号
  232. *<a3.l:アクセス中の環境定義ファイル名
  233. *<a4.l:1行読み込みワークの先頭
  234. *<a5.l:ファイル読み込みバッファの先頭
  235. load_line_loop::
  236.     tst.l    d5
  237.     bmi    load_eof        *ファイルエンド
  238.     bsr    rds            *1行読み込む
  239.     beq    load_line_not_eof
  240.     bset.l    #31,d5            *ファイルエンド
  241. load_line_not_eof::
  242.     tst.b    (a4)
  243.     beq    load_line_loop        *空行や注釈行
  244.     movea.l    a4,a0            *1ワード目
  245.     moveq.l    #M_UNKNOWN_COMMAND,d4
  246.     lea.l    (load_coms)r,a1        *コマンドリスト
  247.     bsr    word_search        *コマンド検索
  248.     bmi    load_line_err        *未定義のコマンド
  249.     move.w    load_jtbl(pc,d0.w),d0    *d0は偶数
  250.     jmp    load_jtbl(pc,d0.w)    *各コマンドの処理に分岐
  251.  
  252. load_jtbl::
  253.     .dc.w    load_com_name-load_jtbl
  254.     .dc.w    load_com_prog-load_jtbl
  255.  
  256.     .dc.w    load_com_rule-load_jtbl
  257.     .dc.w    load_com_target-load_jtbl
  258.  
  259.     .dc.w    load_com_char-load_jtbl
  260.  
  261.     .dc.w    load_com_assign-load_jtbl
  262.     .dc.w    load_com_code-load_jtbl
  263.     .dc.w    load_com_prefix-load_jtbl
  264.     .dc.w    load_com_suffix-load_jtbl
  265.  
  266.     .dc.w    load_com_ask-load_jtbl
  267.     .dc.w    load_com_break-load_jtbl
  268.     .dc.w    load_com_click-load_jtbl
  269.     .dc.w    load_com_copy-load_jtbl
  270.     .dc.w    load_com_den-load_jtbl
  271.     .dc.w    load_com_full-load_jtbl
  272.     .dc.w    load_com_hide-load_jtbl
  273.     .dc.w    load_com_int-load_jtbl
  274.     .dc.w    load_com_joy1-load_jtbl
  275.     .dc.w    load_com_joy2-load_jtbl
  276.     .dc.w    load_com_led-load_jtbl
  277.     .dc.w    load_com_lock-load_jtbl
  278.     .dc.w    load_com_meta-load_jtbl
  279.     .dc.w    load_com_repeat-load_jtbl
  280.     .dc.w    load_com_reset-load_jtbl
  281.     .dc.w    load_com_sbreak-load_jtbl
  282.     .dc.w    load_com_stop-load_jtbl
  283.     .dc.w    load_com_unlock-load_jtbl
  284.  
  285. ********************************
  286. *環境定義ファイルのコマンドリスト
  287. load_coms::
  288. NameNumber = 0
  289.     .dc.b    5,'&name',NameNumber
  290. NameNumber = NameNumber+2
  291.     .dc.b    5,'&prog',NameNumber
  292.  
  293. NameNumber = NameNumber+2
  294.     .dc.b    5,'&rule',NameNumber
  295. NameNumber = NameNumber+2
  296.     .dc.b    7,'&target',NameNumber
  297.  
  298. NameNumber = NameNumber+2
  299.     .dc.b    5,'&char',NameNumber
  300.  
  301. NameNumber = NameNumber+2
  302.     .dc.b    7,'&assign',NameNumber
  303. NameNumber = NameNumber+2
  304.     .dc.b    5,'&code',NameNumber
  305. NameNumber = NameNumber+2
  306.     .dc.b    7,'&prefix',NameNumber
  307. NameNumber = NameNumber+2
  308.     .dc.b    7,'&suffix',NameNumber
  309.  
  310. NameNumber = NameNumber+2
  311.     .dc.b    4,'&ask',NameNumber
  312. NameNumber = NameNumber+2
  313.     .dc.b    6,'&break',NameNumber
  314. NameNumber = NameNumber+2
  315.     .dc.b    6,'&click',NameNumber
  316. NameNumber = NameNumber+2
  317.     .dc.b    5,'©',NameNumber
  318. NameNumber = NameNumber+2
  319.     .dc.b    4,'&den',NameNumber
  320. NameNumber = NameNumber+2
  321.     .dc.b    5,'&full',NameNumber
  322. NameNumber = NameNumber+2
  323.     .dc.b    5,'&hide',NameNumber
  324. NameNumber = NameNumber+2
  325.     .dc.b    4,'&int',NameNumber
  326. NameNumber = NameNumber+2
  327.     .dc.b    5,'&joy1',NameNumber
  328. NameNumber = NameNumber+2
  329.     .dc.b    5,'&joy2',NameNumber
  330. NameNumber = NameNumber+2
  331.     .dc.b    4,'&led',NameNumber
  332. NameNumber = NameNumber+2
  333.     .dc.b    5,'&lock',NameNumber
  334. NameNumber = NameNumber+2
  335.     .dc.b    5,'&meta',NameNumber
  336. NameNumber = NameNumber+2
  337.     .dc.b    7,'&repeat',NameNumber
  338. NameNumber = NameNumber+2
  339.     .dc.b    6,'&reset',NameNumber
  340. NameNumber = NameNumber+2
  341.     .dc.b    7,'&sbreak',NameNumber
  342. NameNumber = NameNumber+2
  343.     .dc.b    5,'&stop',NameNumber
  344. NameNumber = NameNumber+2
  345.     .dc.b    7,'&unlock',NameNumber
  346.     .dc.b    0
  347.     .even
  348.  
  349. ********************************
  350. *&break ルール
  351. *<a0.l:2ワード目
  352. load_com_break::
  353.     moveq.l    #M_TOO_MANY_BREAK,d3
  354.     lea.l    break_table_work,a1    *テーブルのワーク
  355.     lea.l    break_table_work_end-break_table_work(a1),a2
  356.     bra    load_event
  357.  
  358. ********************************
  359. *© ルール
  360. *<a0.l:2ワード目
  361. load_com_copy::
  362.     moveq.l    #M_TOO_MANY_COPY,d3
  363.     lea.l    copy_table_work,a1    *テーブルのワーク
  364.     lea.l    copy_table_work_end-copy_table_work(a1),a2
  365.     bra    load_event
  366.  
  367. ********************************
  368. *&den ルール
  369. *<a0.l:2ワード目
  370. load_com_den::
  371.     moveq.l    #M_TOO_MANY_DEN,d3
  372.     lea.l    den_table_work,a1    *テーブルのワーク
  373.     lea.l    den_table_work_end-den_table_work(a1),a2
  374.     bra    load_event
  375.  
  376. ********************************
  377. *&int ルール
  378. *<a0.l:2ワード目
  379. load_com_int::
  380.     moveq.l    #M_TOO_MANY_INT,d3
  381.     lea.l    int_table_work,a1    *テーブルのワーク
  382.     lea.l    int_table_work_end-int_table_work(a1),a2
  383.     bra    load_event
  384.  
  385. ********************************
  386. *&lock ルール
  387. *<a0.l:2ワード目
  388. load_com_lock::
  389.     moveq.l    #M_TOO_MANY_LOCK,d3
  390.     lea.l    lock_table_work,a1    *テーブルのワーク
  391.     lea.l    lock_table_work_end-lock_table_work(a1),a2
  392.     bra    load_event
  393.  
  394. ********************************
  395. *&reset ルール
  396. *<a0.l:2ワード目
  397. load_com_reset::
  398.     moveq.l    #M_TOO_MANY_RESET,d3
  399.     lea.l    reset_table_work,a1    *テーブルのワーク
  400.     lea.l    reset_table_work_end-reset_table_work(a1),a2
  401.     bra    load_event
  402.  
  403. ********************************
  404. *&sbreak ルール
  405. *<a0.l:2ワード目
  406. load_com_sbreak::
  407.     moveq.l    #M_TOO_MANY_SBREAK,d3
  408.     lea.l    sbreak_table_work,a1    *テーブルのワーク
  409.     lea.l    sbreak_table_work_end-sbreak_table_work(a1),a2
  410.     bra    load_event
  411.  
  412. ********************************
  413. *&unlock ルール
  414. *<a0.l:2ワード目
  415. load_com_unlock::
  416.     moveq.l    #M_TOO_MANY_UNLOCK,d3
  417.     lea.l    unlock_table_work,a1    *テーブルのワーク
  418.     lea.l    unlock_table_work_end-unlock_table_work(a1),a2
  419. *    bra    load_event
  420. ********************************
  421. *イベントのルールの設定
  422. *<d3.l:テーブルが溢れた場合のエラーコード
  423. *<a0.l:2ワード目
  424. *<a1.l:テーブルのワーク
  425. *<a2.l:テーブルのワークの末尾
  426. load_event::
  427.     moveq.l    #M_MISSING_PARAMETER,d4
  428.     tst.b    (a0)
  429.     beq    load_line_err        *ルールが指定されていない
  430.     move.l    a1,d1
  431.     lea.l    (rule_temp)r,a1        *ルールのビット展開領域
  432.     bsr    load_rule        *ルールを読み取る
  433.     bmi    load_line_err
  434.     movea.l    d1,a0            *テーブルのワーク
  435.     bsr    rule_prog_search    *プログラムの条件が同じテーブルを探す
  436.     beq    load_event_set        *同じテーブルがある
  437. *新しいテーブルを作る
  438. *<d1.l:テーブルのワーク
  439. *<d3.l:テーブルが溢れた場合のエラーコード
  440. *<a2.l:テーブルのワークの末尾
  441.     movea.l    d1,a0            *テーブルのワーク
  442.     moveq.l    #0,d1
  443.     bsr    shift_forward        *テーブルを後ろにずらす
  444.     bmi    load_line_err
  445.     lea.l    (rule_temp)r,a1
  446. *ルールを書き込む
  447. *<a0.l:テーブルのワーク
  448. *<a1.l:ルール
  449. load_event_set::
  450.     clr.w    (a0)+            *定数
  451.     moveq.l    #44/4-1,d0
  452. load_event_set_loop::
  453.     move.l    (a1)+,(a0)+        *ルールを書き込む
  454.     dbra    d0,load_event_set_loop
  455.     bra    load_line_loop
  456.  
  457. ********************************
  458. *テーブルを後ろにずらす
  459. *<d1.w:挿入するテーブルのデータ部分のサイズ
  460. *<d3.l:テーブルが溢れた場合のエラーコード
  461. *<a0.l:テーブルのワーク
  462. *<a2.l:テーブルのワークの上限
  463. *>a0.l:エラーなし=テーブルのワーク/エラーあり=不定
  464. *>d4.l:エラーなし=0/エラーあり=エラーコード
  465. *>n:エラーなし=0/エラーあり=1
  466. *?d0/d4/a0-a1
  467. shift_forward::
  468.     bsr    get_table_size
  469.     add.w    d0,d0
  470.     lea.l    2(a0,d0.w),a0        *シフト前のエンドコードの次のアドレス
  471.     lea.l    2+44(a0,d1.w),a1    *シフト後のエンドコードの次のアドレス
  472.     cmpa.l    a2,a1
  473.     bhi    shift_forward_over    *テーブルが溢れた
  474.     lsr.w    #1,d0
  475. shift_forward_shift::
  476.     move.w    -(a0),-(a1)        *テーブルを後ろにずらす
  477.     dbra    d0,shift_forward_shift
  478.     moveq.l    #0,d4
  479.     rts
  480.  
  481. shift_forward_over::
  482.     move.l    d3,d4            *エラーコード
  483.     rts
  484.  
  485. ********************************
  486. *&rule ルール
  487. *<a0.l:2ワード目
  488. load_com_rule::
  489.     lea.l    (rule_work)r,a1
  490.     bsr    load_rule        *ルールを読み取る
  491.     bmi    load_line_err
  492.     st.b    (rule_set)r        *&ruleが設定された
  493.     bra    load_line_loop
  494.  
  495. ********************************
  496. *&name キーコード キーネーム
  497. *<a0.l:2ワード目
  498. load_com_name::
  499.     moveq.l    #M_ILLEGAL_KEY_CODE,d4
  500.     cmpi.b    #2,(a0)+        *長さ
  501.     bne    load_line_err
  502.     bsr    chrhex2            *16進数2桁をバイナリに変換
  503.     bmi    load_line_err
  504.     move.w    d0,d1            *キーコード
  505.     move.l    a0,d2            *キーネーム
  506.     lea.l    (name_work)r,a1
  507.     bsr    word_search
  508.     moveq.l    #M_TOO_MANY_PARAMETERS,d4
  509.     movea.l    d2,a0
  510.     moveq.l    #0,d3
  511.     move.b    (a0)+,d3
  512.     tst.b    (a0,d3.w)
  513.     bne    load_line_err        *キーネームの後に何かある
  514.     tst.l    d0
  515.     bmi    load_com_name_new    *未定義のキーネーム
  516.     moveq.l    #M_DUPLICATE_NAME,d4
  517.     cmp.b    d0,d1
  518.     bne    load_line_err        *キーネームの二重定義
  519.     bra    load_line_loop        *同じコードでの二重定義は無視する
  520.  
  521. *<d1.w:キーコード
  522. *<d2.l:キーネーム
  523. load_com_name_new::
  524.     moveq.l    #M_ILLEGAL_KEY_CODE,d4
  525.     cmp.b    #$90,d1
  526.     bhs    load_line_err        *キーコードが範囲外
  527.     movea.l    d2,a0            *キーネーム
  528.     moveq.l    #0,d0
  529.     move.b    (a0)+,d0        *キーネームの長さ
  530.     movea.l    (last_name_tail)r,a1    *キーネームの並びの末尾
  531.     lea.l    1+1(a1,d0.w),a2        *書き込み後のキーネームの並びの末尾
  532.     moveq.l    #M_TOO_MANY_NAMES,d4
  533.     cmpa.l    #name_work_tail,a2
  534.     bhs    load_line_err        *キーネームのワークが溢れた
  535.     move.b    d0,(a1)+
  536.     subq.w    #1,d0
  537. load_com_name_copy::
  538.     move.b    (a0)+,(a1)+        *キーネームをコピー
  539.     dbra    d0,load_com_name_copy
  540.     move.b    d1,(a1)+        *キーコード
  541.     clr.b    (a1)            *エンドコード
  542.     move.l    a1,(last_name_tail)r    *キーネームの並びの末尾を更新
  543.     bra    load_line_loop
  544.  
  545. ********************************
  546. *&joy1 キーネーム …
  547. *<a0.l:2ワード目
  548. load_com_joy1::
  549.     lea.l    (joy1_map_work)r,a1
  550.     bra    load_joy
  551.  
  552. ********************************
  553. *&joy2 キーネーム …
  554. *<a0.l:2ワード目
  555. load_com_joy2::
  556.     lea.l    (joy2_map_work)r,a1
  557. *    bra    load_joy
  558. ********************************
  559. *ジョイスティックのキーの設定
  560. *  標準で未使用のビットも含めて8データ設定します。
  561. *  引数の省略はできません。
  562. *<a0.l:2ワード目
  563. *<a1.l:マップのアドレス
  564. load_joy::
  565.     moveq.l    #8-1,d1
  566. load_joy_loop::
  567.     moveq.l    #M_MISSING_PARAMETER,d4
  568.     tst.b    (a0)
  569.     beq    load_line_err        *引数が足りない
  570.     moveq.l    #M_UNDEFINED_NAME,d4
  571.     bsr    name_search
  572.     bmi    load_line_err        *キーネームが違う
  573.     move.b    d0,(a1)+
  574.     dbra    d1,load_joy_loop
  575.     moveq.l    #M_TOO_MANY_PARAMETERS,d4
  576.     tst.b    (a0)
  577.     bne    load_line_err        *引数が多すぎる
  578.     bra    load_line_loop
  579.  
  580. ********************************
  581. *&led キーネーム …
  582. *  1つ目のキーネームのキーのLEDを2つ目以降のキーのLEDに反映させます。
  583. *<a0.l:2ワード目
  584. load_com_led::
  585.     moveq.l    #7,d3
  586.     moveq.l    #M_MISSING_PARAMETER,d4
  587.     tst.b    (a0)
  588.     beq    load_line_err        *引数が足りない
  589.     bsr    name_to_led        *キーネームをLEDの番号に変換する
  590.     bmi    load_line_err
  591.     move.l    d0,d1
  592.     moveq.l    #-1,d2            *反映させるLEDのビットが0になる
  593.     lea.l    (led_map_work)r,a1
  594.     bra    load_com_led_cont
  595.  
  596. load_com_led_loop::
  597.     bsr    name_to_led        *キーネームをLEDの番号に変換する
  598.     bmi    load_line_err
  599.     moveq.l    #M_DUPLICATE_PARAMETER,d4
  600.     bclr.l    d0,d2            *反映させるLEDのビットをクリア
  601.     beq    load_line_err        *既にクリアされていた
  602. load_com_led_cont::
  603.     tst.b    (a0)
  604.     bne    load_com_led_loop    *引数が多すぎる
  605.     move.b    d2,(a1,d1.w)        *マップに設定する
  606.     bra    load_line_loop
  607.  
  608. ********************************
  609. *キーネームをLEDの番号に変換する
  610. *<d3.w:7
  611. *<a0.l:ワード
  612. *>d0.w:エラーなし=LEDの番号/エラーあり=不定
  613. *>d4.l:エラーなし=0/エラーあり=エラーコード
  614. *>a0.l:エラーなし=次のワード/エラーあり=不定
  615. *>n:エラーなし=0/エラーあり=1
  616. *?d0/d4/a0
  617. name_to_led::
  618.     moveq.l    #M_UNDEFINED_NAME,d4
  619.     bsr    name_search
  620.     bmi    name_to_led_err
  621.     moveq.l    #M_ILLEGAL_KEY_CODE,d4
  622.     sub.w    #$80+7,d0
  623.     addq.w    #7,d0
  624.     bcs    name_to_led_end
  625.     sub.w    #$5A+7-$80,d0
  626.     addq.w    #7,d0
  627.     bcc    name_to_led_err
  628. name_to_led_end::
  629.     moveq.l    #0,d4
  630. name_to_led_err::
  631.     tst.l    d4
  632.     rts
  633.  
  634. ********************************
  635. *&target キーネーム …
  636. *<a0.l:2ワード目
  637. load_com_target::
  638. load_target::
  639.     moveq.l    #M_MISSING_PARAMETER,d4
  640.     tst.b    (a0)
  641.     beq    load_line_err        *引数が足りない
  642.     lea.l    (target_mark)r,a2    *二重定義チェックのためのワーク
  643.     moveq.l    #0,d0
  644.     moveq.l    #128/4-1,d1
  645. load_target_clr::
  646.     move.l    d0,(a2)+
  647.     dbra    d1,load_target_clr
  648.     lea.l    (target_mark)r,a2
  649.     lea.l    (target_work)r,a1    *&targetのワーク
  650.     st.b    (target_min)r        *キーコードの最小値
  651.     sf.b    (target_max)r        *キーコードの最大値
  652.     moveq.l    #128-1,d1
  653. load_target_loop::
  654.     moveq.l    #M_UNDEFINED_NAME,d4
  655.     bsr    name_search        *キーコードを得る
  656.     bmi    load_line_err
  657.     bsr    code_to_scan        *キーコードをスキャンコードに変換
  658.     bmi    load_line_err
  659.     moveq.l    #M_DUPLICATE_PARAMETER,d4
  660.     tas.b    (a2,d0.w)
  661.     bne    load_line_err        *同じコードが2回現れた
  662.     move.b    d0,(a1)+        *スキャンコードを設定
  663.     cmp.b    (target_min)r,d0
  664.     bhs    load_target_not_min
  665.     move.b    d0,(target_min)r    *最小値を更新する
  666. load_target_not_min::
  667.     cmp.b    (target_max)r,d0
  668.     bls    load_target_not_max
  669.     move.b    d0,(target_max)r    *最大値を更新する
  670. load_target_not_max::
  671.     move.b    (a0),d0
  672.     dbeq    d1,load_target_loop    *まだ引数があればループ
  673.     moveq.l    #M_TOO_MANY_PARAMETERS,d4
  674.     move.w    #128,d0
  675.     sub.w    d1,d0            *引数の個数
  676.     bcs    load_line_err        *引数が多すぎる
  677.     move.w    d0,(target_count)r    *引数の個数
  678.     bra    load_line_loop
  679.  
  680. ********************************
  681. *&repeat {0|1} …
  682. load_com_repeat::
  683.     lea.l    (live_repeat_bits_work)r,a2
  684.     bra    load_repeat
  685.  
  686. ********************************
  687. *&stop {0|1} …
  688. load_com_stop::
  689.     lea.l    (kill_repeat_bits_work)r,a2
  690. *    bra    load_repeat
  691. ********************************
  692. *リピート関係のマップの定義
  693. *<a0.l:2ワード目
  694. *<a2.l:ワークのアドレス
  695. load_repeat::
  696.     moveq.l    #M_TARGET_NOT_BINDED,d4
  697.     move.w    (target_count)r,d1    *設定するデータ数
  698.     beq    load_line_err        *&targetが設定されていない
  699.     lea.l    (target_work)r,a1
  700.     moveq.l    #0,d2
  701.     subq.w    #1,d1
  702. load_repeat_loop::
  703.     move.b    (a1)+,d2        *キーコード
  704.     move.w    d2,d3
  705.     lsr.w    #3,d3
  706.     moveq.l    #M_MISSING_PARAMETER,d4
  707.     move.b    (a0)+,d0
  708.     beq    load_line_err        *引数が足りない
  709.     moveq.l    #M_ILLEGAL_PARAMETER,d4
  710.     subq.b    #1,d0
  711.     bne    load_line_err        *引数が違う
  712.     moveq.l    #-'1',d0
  713.     add.b    (a0)+,d0
  714.     beq    load_repeat_one
  715.     addq.b    #'1'-'0',d0
  716.     bne    load_line_err        *引数が違う
  717.     bclr.b    d2,(a2,d3.w)        *0を設定
  718.     bra    load_repeat_next
  719.  
  720. load_repeat_one::
  721.     bset.b    d2,(a2,d3.w)
  722. load_repeat_next::
  723.     dbra    d1,load_repeat_loop
  724.     moveq.l    #M_TOO_MANY_PARAMETERS,d4
  725.     tst.b    (a0)
  726.     bne    load_line_err        *引数が多すぎる
  727.     bra    load_line_loop
  728.  
  729. ********************************
  730. *新しいコード変換テーブルを作る
  731. *<d1.b:スキャンコードの最小値
  732. *<d2.b:スキャンコードの最大値
  733. *<d3.w:1データのサイズの最大値
  734. *<a0.l:テーブルの先頭
  735. *<a1.l:ルールの先頭
  736. *?d0-d2/a0-a2
  737. make_xtbl::
  738.     addq.w    #2,a0
  739.  .rept 44/4
  740.     move.l    (a1)+,(a0)+        *ルール
  741.  .endm
  742.     movea.l    a0,a2
  743.     move.b    d1,(a2)+        *最初のデータのスキャンコード
  744.     addq.b    #1,d2
  745.     sub.b    d1,d2            *データ数
  746.     move.b    d2,(a2)+        *データ数
  747.     move.b    d3,(a2)+        *1データのサイズの最大値
  748.     moveq.l    #0,d1
  749.     move.b    d2,d1
  750.     subq.w    #1,d1            *データ数-1
  751.     moveq.l    #0,d2
  752.     move.b    d3,d2
  753.     subq.w    #2,d2            *1データのサイズの最大値-2
  754. make_xtbl_loop::
  755.     move.b    #$FE,(a2)+        *先頭は$FE
  756.     move.w    d2,d0
  757.     bmi    make_xtbl_next        *サイズが1バイト
  758. make_xtbl_rest::
  759.     st.b    (a2)+            *残りは$FFで充填する
  760.     dbra    d0,make_xtbl_rest
  761. make_xtbl_next::
  762.     dbra    d1,make_xtbl_loop
  763.     sf.b    (a2)+
  764.     move.w    a2,d0
  765.     sub.w    a0,d0            *データ部分のサイズ+1
  766.     and.w    #$FFFE,d0        *偶数に切り上げ
  767.     move.w    d0,-2-44(a0)        *データサイズを設定
  768.     rts
  769.  
  770. ********************************
  771. *コード変換テーブルを拡張しながらコピーする
  772. *  スキャンコードの符号は一致していること。
  773. *<d1.b:スキャンコードの最小値
  774. *<d2.b:スキャンコードの最大値
  775. *<d3.w:1データのサイズの最大値
  776. *<a0.l:コピー先のテーブルの先頭
  777. *<a1.l:コピー元のテーブルの先頭
  778. *?d0-d1/a0/a2
  779. copy_xtbl::
  780.     movem.l    d4-d7/a1,-(sp)
  781.     addq.w    #2,a0
  782.     addq.w    #2,a1
  783.  .rept 44/4
  784.     move.l    (a1)+,(a0)+        *ルール
  785.  .endm
  786.     movea.l    a0,a2            *コピー先のルールの直後
  787.     moveq.l    #0,d4
  788.     move.b    (a1)+,d4        *元の最初のデータのスキャンコード
  789.     move.b    d4,(a2)+
  790.     moveq.l    #0,d5
  791.     move.b    (a1)+,d5        *元のデータ数
  792.     move.b    d5,(a2)+
  793.     moveq.l    #0,d6
  794.     move.b    (a1)+,d6        *元の1データのサイズの最大値
  795.     moveq.l    #0,d7            *1データのサイズの増分
  796.     cmp.b    d6,d3
  797.     bls    copy_xtbl_not_longer    *増分なし
  798.     move.w    d3,d7
  799.     sub.w    d6,d7            *1データのサイズの増分
  800. copy_xtbl_not_longer::
  801.     add.w    d7,d6            *新しい1データのサイズの最大値
  802.     move.b    d6,(a2)+
  803. *<d1.b:スキャンコードの最小値
  804. *<d2.b:スキャンコードの最大値
  805. *<d3.b:1データのサイズの最大値
  806. *<d4.l:元の最初のデータのスキャンコード
  807. *<d5.l:元のデータ数
  808. *<d6.l:新しい1データのサイズの最大値
  809. *<d7.l:1データのサイズの最大値の増分
  810. *<a0.l:コピー元のルールの直後
  811. *<a1.l:コピー元の最初のデータの位置
  812. *<a2.l:コピー先の最初のデータの位置
  813.     cmp.b    d4,d1
  814.     bhs    copy_xtbl_top_ok    *最初のデータのスキャンコードは小さくならない
  815.     move.b    d1,(a0)            *新しい最初のスキャンコード
  816.     move.w    d4,d1            *元の最初のデータのスキャンコード
  817.     sub.b    (a0),d1            *最初のデータのスキャンコードの減分
  818.     add.b    d1,1(a0)        *データ数を増やす
  819.     subq.w    #1,d1            *最初のデータのスキャンコードの減分-1
  820.     subq.w    #2,d6            *新しい1データのサイズの最大値-2
  821. copy_xtbl_top_loop::
  822.     move.b    #$FE,(a2)+        *先頭は$FE
  823.     move.w    d6,d0
  824.     bmi    copy_xtbl_top_next    *サイズが1バイト
  825. copy_xtbl_top_rest::
  826.     st.b    (a2)+            *残りは$FFで充填する
  827.     dbra    d0,copy_xtbl_top_rest
  828. copy_xtbl_top_next::
  829.     dbra    d1,copy_xtbl_top_loop
  830.     addq.w    #2,d6            *新しい1データのサイズの最大値
  831. copy_xtbl_top_ok::
  832.     sub.w    d7,d6            *元の1データのサイズの最大値
  833.     add.w    d5,d4
  834.     subq.w    #1,d4            *元の最後のデータのスキャンコード
  835.     subq.w    #1,d5            *元のデータ数-1
  836.     subq.w    #1,d6            *元の1データのサイズの最大値-1
  837.     subq.w    #1,d7            *1データのサイズの最大値の増分-1
  838. copy_xtbl_loop::
  839.     move.w    d6,d0            *元の1データのサイズの最大値-1
  840. copy_xtbl_copy::
  841.     move.b    (a1)+,(a2)+        *元のデータをコピー
  842.     dbra    d0,copy_xtbl_copy
  843.     move.w    d7,d0            *1データのサイズの最大値の増分-1
  844.     bmi    copy_xtbl_copy_next    *増分なし
  845. copy_xtbl_copy_rest::
  846.     st.b    (a2)+            *残りは$FFで充填する
  847.     dbra    d0,copy_xtbl_copy_rest
  848. copy_xtbl_copy_next::
  849.     dbra    d5,copy_xtbl_loop
  850.     cmp.b    d4,d2
  851.     bls    copy_xtbl_btm_ok    *最後のデータのスキャンコードは大きくならない
  852.     moveq.l    #0,d1
  853.     move.b    d2,d1            *スキャンコードの最大値
  854.     sub.w    d4,d1            *最後のデータのスキャンコードの増分
  855.     add.b    d1,1(a0)        *データ数を増やす
  856.     subq.w    #1,d1            *最後のデータのスキャンコードの増分-1
  857.     add.b    d7,d6            *新しい1データのサイズの最大値-2
  858. copy_xtbl_btm_loop::
  859.     move.b    #$FE,(a2)+        *先頭は$FE
  860.     move.w    d6,d0
  861.     bmi    copy_xtbl_btm_next    *サイズが1バイト
  862. copy_xtbl_btm_rest::
  863.     st.b    (a2)+            *残りは$FFで充填する
  864.     dbra    d0,copy_xtbl_btm_rest
  865. copy_xtbl_btm_next::
  866.     dbra    d1,copy_xtbl_btm_loop
  867. copy_xtbl_btm_ok::
  868.     sf.b    (a2)+
  869.     move.w    a2,d0
  870.     sub.w    a0,d0            *データ部分のサイズ+1
  871.     and.w    #$FFFE,d0        *偶数に切り上げ
  872.     move.w    d0,-2-44(a0)        *データサイズを設定
  873.     movem.l    (sp)+,d4-d7/a1
  874.     rts
  875.  
  876. ********************************
  877. *テーブルを削除する
  878. *<a1.l:削除するテーブルの先頭
  879. *?d0/a0-a1
  880. erase_table::
  881.     move.w    (a1),d0
  882.     lea.l    2+44(a1,d0.w),a0
  883.     bsr    get_table_size        *元のテーブルの後ろのサイズ
  884. erase_table_loop::
  885.     move.w    (a0)+,(a1)+        *後ろの部分を詰める
  886.     dbra    d0,erase_table_loop
  887.     rts
  888.  
  889. ********************************
  890. *テーブルをコピーする
  891. *<a0.l:コピー先
  892. *<a1.l:コピー元
  893. *?d0/a0-a1
  894. duplicate_table::
  895.     move.w    (a1),d0
  896.     lsr.w    #1,d0            *データ部分のワード数
  897.     add.w    #(2+44)/2-1,d0        *ヘッダの部分を加えてから-1
  898. duplicate_table_loop::
  899.     move.w    (a1)+,(a0)+        *新しいテーブルを書き込む
  900.     dbra    d0,duplicate_table_loop
  901.     rts
  902.  
  903. ********************************
  904. *&char 文字列 …
  905. *<a0.l:2ワード目
  906. load_com_char::
  907. load_char::
  908.     moveq.l    #M_RULE_NOT_BINDED,d4
  909.     tst.b    (rule_set)r
  910.     beq    load_line_err        *&ruleが設定されていない
  911.     moveq.l    #M_TARGET_NOT_BINDED,d4
  912.     move.w    (target_count)r,d1    *設定するデータ数
  913.     beq    load_line_err        *&targetが設定されていない
  914.     subq.w    #1,d1
  915. *データ数と最大の長さを調べる
  916. *<d1.w:&targetの引数の個数-1
  917. *<a0.l:2ワード目
  918.     movea.l    a0,a1            *2ワード目
  919.     moveq.l    #0,d0            *長さ
  920.     moveq.l    #0,d3            *最大長
  921.     moveq.l    #M_MISSING_PARAMETER,d4
  922.     move.w    d1,d2            *引数の個数-1
  923. load_char_chk::
  924.     move.b    (a1)+,d0        *長さ
  925.     beq    load_line_err        *引数が足りない
  926.     adda.w    d0,a1
  927.     cmp.b    d3,d0
  928.     bls    load_char_chk_nxt
  929.     move.b    d0,d3            *最大長を更新
  930. load_char_chk_nxt::
  931.     dbra    d2,load_char_chk
  932.     moveq.l    #M_TOO_MANY_PARAMETERS,d4
  933.     tst.b    (a1)
  934.     bne    load_line_err        *引数が多すぎる
  935.     moveq.l    #M_TOO_LONG_CHARS,d4
  936.     cmp.b    #32,d3
  937.     bhi    load_line_err        *長すぎる引数がある
  938. *既に存在するテーブルのルールと一致するか確かめる
  939. *<d1.w:&targetの引数の個数-1
  940. *<d3.w:1データのサイズの最大値
  941. *<a0.l:2ワード目
  942.     move.l    a0,-(sp)
  943.     lea.l    char_table_work,a1
  944.     bsr    rule_search
  945.     lea.l    -(2+44)(a1),a1
  946.     bne    load_char_new        *同じルールのテーブルは存在しない
  947. *テーブルを作り直す
  948. *<d3.w:1データのサイズの最大値
  949. *<a1.l:元のテーブルの先頭
  950. *<(sp).l:2ワード目
  951.     lea.l    (char_table_temp)r,a0    *テーブルの先頭
  952.     move.b    (target_min),d1        *スキャンコードの最小値
  953.     move.b    (target_max),d2        *スキャンコードの最大値
  954.     bsr    copy_xtbl        *テーブルを拡張しながらコピーする
  955.     bsr    erase_table        *テーブルを削除する
  956.     moveq.l    #0,d3
  957.     move.b    (char_table_temp+2+44+2)r,d3    *新しい1データのサイズの最大値
  958. *<d3.w:新しい1データのサイズの最大値
  959. *<(sp).l:2ワード目
  960.     bra    load_char_expand
  961.  
  962. *新しいテーブルを作る
  963. *<d3.w:新しい1データのサイズの最大値
  964. *<(sp).l:2ワード目
  965. load_char_new::
  966.     lea.l    (char_table_temp)r,a0    *テーブルの先頭
  967.     lea.l    (rule_work)r,a1        *ルールの先頭
  968.     move.b    (target_min),d1        *スキャンコードの最小値
  969.     move.b    (target_max),d2        *スキャンコードの最大値
  970.     bsr    make_xtbl        *新しいコード変換テーブルを作る
  971. *&charの引数をテーブルに書き込む
  972. *<d3.w:新しい1データのサイズの最大値
  973. *<(sp).l:2ワード目
  974. load_char_expand::
  975.     movea.l    (sp)+,a0        *2ワード目
  976.     move.l    a3,-(sp)        *ワークに使うため保護
  977.     lea.l    (char_table_temp)r,a1    *テーブルの先頭
  978.     lea.l    (target_work)r,a2    *&targetの引数の並び
  979.     move.w    (target_count)r,d1    *&targetの引数の個数
  980.     subq.w    #1,d1            *&targetの引数の個数-1
  981. load_char_loop::
  982.     moveq.l    #0,d0
  983.     move.b    (a2)+,d0        *スキャンコード
  984.     sub.b    2+44(a1),d0        *何番目のデータか
  985.     cmp.w    #1,d3
  986.     beq    load_char_not_mul    *1データが1バイト
  987.     mulu.w    d3,d0
  988. load_char_not_mul::
  989.     lea.l    2+44+3(a1,d0.w),a3    *書き込む位置
  990.     moveq.l    #0,d0
  991.     move.b    (a0)+,d0        *文字列の長さ
  992.     move.w    d3,d2
  993.     sub.w    d0,d2            *残りの長さ
  994.     subq.w    #1,d0            *文字列の長さ-1
  995. load_char_copy::
  996.     move.b    (a0)+,(a3)+        *文字列をコピーする
  997.     dbra    d0,load_char_copy
  998.     subq.w    #1,d2            *残りの長さ-1
  999.     bcs    load_char_not_rest
  1000. load_char_rest::
  1001.     st.b    (a3)+            *残りを$FFで充填する
  1002.     dbra    d2,load_char_rest
  1003. load_char_not_rest::
  1004.     dbra    d1,load_char_loop
  1005.     movea.l    (sp)+,a3        *ワークに使ったので復元
  1006. *新しいテーブルをテーブルの並びの先頭に追加する
  1007.     move.w    (char_table_temp)r,d1    *データ部分のサイズ
  1008.     moveq.l    #M_TOO_MANY_CHAR,d3
  1009.     lea.l    char_table_work,a0    *ワークの先頭
  1010.     lea.l    char_table_work_end-char_table_work(a0),a2    *ワークの上限
  1011.     bsr    shift_forward        *テーブルを後ろにずらす
  1012.     bmi    load_line_err        *テーブルの領域が溢れた
  1013.     lea.l    (char_table_temp)r,a1
  1014.     bsr    duplicate_table        *先頭に書き込む
  1015.     bra    load_line_loop
  1016.  
  1017. ********************************
  1018. *&assign {キーコード|キーネーム}{=0|[=1]} …
  1019. *<a0.l:2ワード目
  1020. load_com_assign::
  1021. load_assign::
  1022.     moveq.l    #M_RULE_NOT_BINDED,d4
  1023.     tst.b    (rule_set)r
  1024.     beq    load_line_err        *&ruleが設定されていない
  1025.     bsr    assign_sub        *引数を展開,結果はassign_tempへ
  1026.     bmi    load_line_err
  1027.     subq.w    #1,d3            *2番目以降の引数の個数(0でも可)
  1028. *既に存在するテーブルのルールと一致するか確かめる
  1029. *<d3.l:2番目以降の引数の個数
  1030.     lea.l    assign_table_work,a1
  1031.     bra    load_assign_search
  1032.  
  1033. load_assign_retry::
  1034.     move.w    (a1),d0
  1035.     lea.l    2+44(a1,d0.w),a1    *次のテーブル
  1036. load_assign_search::
  1037.     bsr    rule_search
  1038.     lea.l    -2-44(a1),a1
  1039.     bne    load_assign_new        *同じルールのテーブルは存在しない
  1040.     moveq.l    #0,d0
  1041.     move.b    (assign_temp)r,d0    *最初の引数のスキャンコード
  1042.     move.b    2+44(a1),d1        *テーブルにあるスキャンコード
  1043.     eor.b    d0,d1
  1044.     bmi    load_assign_retry    *スキャンコードの符号が違う
  1045. *テーブルを作り直す
  1046. *<d0.l:最初の引数
  1047. *<d3.l:2番目以降の引数の個数
  1048. *<a1.l:元のテーブルの先頭
  1049.     lea.l    (assign_table_temp)r,a0    *テーブルの先頭
  1050.     move.l    d0,d1            *スキャンコードの最小値
  1051.     move.l    d0,d2            *スキャンコードの最大値
  1052.     bsr    copy_xtbl        *テーブルを拡張しながらコピーする
  1053.     bsr    erase_table        *テーブルを削除する
  1054. *<d3.l:2番目以降の引数の個数
  1055.     bra    load_assign_expand
  1056.  
  1057. *新しいテーブルを作る
  1058. *<d3.l:2番目以降の引数の個数(0でも可)
  1059. load_assign_new::
  1060.     lea.l    (assign_table_temp)r,a0    *テーブルの先頭
  1061.     lea.l    (rule_work)r,a1        *ルールの先頭
  1062.     moveq.l    #0,d0
  1063.     move.b    (assign_temp)r,d0    *最初の引数のスキャンコード
  1064.     move.l    d0,d1            *スキャンコードの最小値
  1065.     move.l    d0,d2            *スキャンコードの最大値
  1066.     move.w    d3,-(sp)
  1067.     bne    load_assign_not_zero
  1068.     addq.w    #1,d3            *サイズが0のときは1に変更する
  1069. load_assign_not_zero::
  1070.     bsr    make_xtbl        *新しいコード変換テーブルを作る
  1071.     move.w    (sp)+,d3
  1072. *引数をテーブルに書き込む
  1073. *<d3.l:2番目以降の引数の個数(0でも可)
  1074. load_assign_expand::
  1075.     lea.l    (assign_temp)r,a0    *引数の並び
  1076.     lea.l    (assign_table_temp)r,a1    *テーブルの先頭
  1077.     moveq.l    #0,d0
  1078.     move.b    (a0)+,d0        *最初の引数のスキャンコード
  1079.     sub.b    2+44(a1),d0        *何番目のデータか
  1080.     moveq.l    #0,d1
  1081.     move.b    2+44+2(a1),d1        *1データのサイズの最大値
  1082.     cmp.w    #1,d1
  1083.     beq    load_assign_not_mul    *1データが1バイト
  1084.     mulu.w    d1,d0
  1085. load_assign_not_mul::
  1086.     lea.l    2+44+3(a1,d0.w),a2    *書き込む位置
  1087.     sub.w    d3,d1            *残りのバイト数
  1088.     subq.w    #1,d3            *2番目以降の引数の個数-1
  1089.     bcs    load_assign_null    *2番目以降の引数がない
  1090. load_assign_copy::
  1091.     move.b    (a0)+,(a2)+        *スキャンコード列をコピーする
  1092.     dbra    d3,load_assign_copy
  1093. load_assign_null::
  1094.     subq.w    #1,d1            *残りのバイト数-1
  1095.     bcs    load_assign_not_rest    *1データが1バイト
  1096. load_assign_rest::
  1097.     st.b    (a2)+            *残りを$FFで充填する
  1098.     dbra    d0,load_assign_rest
  1099. load_assign_not_rest::
  1100. *新しいテーブルをテーブルの並びの先頭に追加する
  1101.     move.w    (assign_table_temp)r,d1    *データ部分のサイズ
  1102.     moveq.l    #M_TOO_MANY_ASSIGN,d3
  1103.     lea.l    assign_table_work,a0    *ワークの先頭
  1104.     lea.l    assign_table_work_end-assign_table_work(a0),a2    *ワークの上限
  1105.     bsr    shift_forward        *テーブルを後ろにずらす
  1106.     bmi    load_line_err        *テーブルの領域が溢れた
  1107.     lea.l    (assign_table_temp)r,a1
  1108.     bsr    duplicate_table        *先頭に書き込む
  1109.     bra    load_line_loop
  1110.  
  1111. ********************************
  1112. *&prefix {キーコード|キーネーム}{=0|[=1]} …
  1113. *<a0.l:2ワード目
  1114. load_com_prefix::
  1115. load_prefix::
  1116.     moveq.l    #M_RULE_NOT_BINDED,d4
  1117.     tst.b    (rule_set)r
  1118.     beq    load_line_err        *&ruleが設定されていない
  1119.     moveq.l    #M_TARGET_NOT_BINDED,d4
  1120.     tst.w    (target_count)r
  1121.     beq    load_line_err        *&targetが設定されていない
  1122.     bsr    assign_sub        *引数を展開,結果はassign_tempへ
  1123.     bmi    load_line_err
  1124. *既に存在するテーブルのルールと一致するか確かめる
  1125. *<d3.l:引数の個数
  1126.     lea.l    prefix_table_work,a1
  1127.     bsr    rule_search
  1128.     lea.l    -2-44(a1),a1
  1129.     bne    load_prefix_new        *同じルールのテーブルは存在しない
  1130. *テーブルを作り直す
  1131. *<d3.l:引数の個数
  1132. *<a1.l:元のテーブルの先頭
  1133.     lea.l    (prefix_table_temp)r,a0    *テーブルの先頭
  1134.     move.b    (target_min)r,d1    *スキャンコードの最小値
  1135.     move.b    (target_max)r,d2    *スキャンコードの最大値
  1136.     bsr    copy_xtbl        *テーブルを拡張しながらコピーする
  1137.     bsr    erase_table        *テーブルを削除する
  1138. *<d3.l:引数の個数
  1139.     bra    load_prefix_expand
  1140.  
  1141. *新しいテーブルを作る
  1142. *<d3.l:引数の個数
  1143. load_prefix_new::
  1144.     lea.l    (prefix_table_temp)r,a0    *テーブルの先頭
  1145.     lea.l    (rule_work)r,a1        *ルールの先頭
  1146.     move.b    (target_min)r,d1    *スキャンコードの最小値
  1147.     move.b    (target_max)r,d2    *スキャンコードの最大値
  1148.     bsr    make_xtbl        *新しいコード変換テーブルを作る
  1149. *引数をテーブルに書き込む
  1150. *<d3.l:引数の個数
  1151. load_prefix_expand::
  1152.     move.l    a3,-(sp)        *ワークに使うため保護
  1153.     lea.l    (prefix_table_temp)r,a1    *テーブルの先頭
  1154.     lea.l    (target_work)r,a2    *&targetの引数の並び
  1155.     move.w    (target_count)r,d1    *&targetの引数の個数
  1156.     subq.w    #1,d1            *&targetの引数の個数-1
  1157. load_prefix_loop::
  1158.     moveq.l    #0,d0
  1159.     move.b    (a2)+,d0        *スキャンコード
  1160.     sub.b    2+44(a1),d0        *何番目のデータか
  1161.     moveq.l    #0,d2
  1162.     move.b    2+44+2(a1),d2        *1データのサイズの最大値
  1163.     cmp.w    #1,d2
  1164.     beq    load_prefix_not_mul    *1データが1バイト
  1165.     mulu.w    d2,d0
  1166. load_prefix_not_mul::
  1167.     lea.l    2+44+3(a1,d0.w),a3    *書き込む位置
  1168.     lea.l    (assign_temp)r,a0    *&prefixの引数の並び
  1169.     move.w    d3,d0            *引数の個数
  1170.     sub.w    d0,d2            *残りの長さ
  1171.     subq.w    #1,d0            *引数の個数-1
  1172. load_prefix_copy::
  1173.     move.b    (a0)+,(a3)+        *スキャンコードをコピーする
  1174.     dbra    d0,load_prefix_copy
  1175.     subq.w    #1,d2            *残りの長さ-1
  1176.     bcs    load_prefix_not_rest
  1177. load_prefix_rest::
  1178.     st.b    (a3)+            *残りを$FFで充填する
  1179.     dbra    d2,load_prefix_rest
  1180. load_prefix_not_rest::
  1181.     dbra    d1,load_prefix_loop
  1182.     movea.l    (sp)+,a3        *ワークに使ったので復元
  1183. *新しいテーブルをテーブルの並びの先頭に追加する
  1184.     move.w    (prefix_table_temp)r,d1    *データ部分のサイズ
  1185.     moveq.l    #M_TOO_MANY_PREFIX,d3
  1186.     lea.l    prefix_table_work,a0    *ワークの先頭
  1187.     lea.l    prefix_table_work_end-prefix_table_work(a0),a2    *ワークの上限
  1188.     bsr    shift_forward        *テーブルを後ろにずらす
  1189.     bmi    load_line_err        *テーブルの領域が溢れた
  1190.     lea.l    (prefix_table_temp)r,a1
  1191.     bsr    duplicate_table        *先頭に書き込む
  1192.     bra    load_line_loop
  1193.  
  1194. ********************************
  1195. *&suffix {キーコード|キーネーム}{=0|[=1]} …
  1196. *<a0.l:2ワード目
  1197. load_com_suffix::
  1198. load_suffix::
  1199.     moveq.l    #M_RULE_NOT_BINDED,d4
  1200.     tst.b    (rule_set)r
  1201.     beq    load_line_err        *&ruleが設定されていない
  1202.     moveq.l    #M_TARGET_NOT_BINDED,d4
  1203.     tst.w    (target_count)r
  1204.     beq    load_line_err        *&targetが設定されていない
  1205.     bsr    assign_sub        *引数を展開,結果はassign_tempへ
  1206.     bmi    load_line_err
  1207. *既に存在するテーブルのルールと一致するか確かめる
  1208. *<d3.l:引数の個数
  1209.     lea.l    suffix_table_work,a1
  1210.     bsr    rule_search
  1211.     lea.l    -2-44(a1),a1
  1212.     bne    load_suffix_new        *同じルールのテーブルは存在しない
  1213. *テーブルを作り直す
  1214. *<d3.l:引数の個数
  1215. *<a1.l:元のテーブルの先頭
  1216.     lea.l    (suffix_table_temp)r,a0    *テーブルの先頭
  1217.     move.b    (target_min)r,d1    *スキャンコードの最小値
  1218.     move.b    (target_max)r,d2    *スキャンコードの最大値
  1219.     bsr    copy_xtbl        *テーブルを拡張しながらコピーする
  1220.     bsr    erase_table        *テーブルを削除する
  1221. *<d3.l:引数の個数
  1222.     bra    load_suffix_expand
  1223.  
  1224. *新しいテーブルを作る
  1225. *<d3.l:引数の個数
  1226. load_suffix_new::
  1227.     lea.l    (suffix_table_temp)r,a0    *テーブルの先頭
  1228.     lea.l    (rule_work)r,a1        *ルールの先頭
  1229.     move.b    (target_min)r,d1    *スキャンコードの最小値
  1230.     move.b    (target_max)r,d2    *スキャンコードの最大値
  1231.     bsr    make_xtbl        *新しいコード変換テーブルを作る
  1232. *引数をテーブルに書き込む
  1233. *<d3.l:引数の個数
  1234. load_suffix_expand::
  1235.     move.l    a3,-(sp)        *ワークに使うため保護
  1236.     lea.l    (suffix_table_temp)r,a1    *テーブルの先頭
  1237.     lea.l    (target_work)r,a2    *&targetの引数の並び
  1238.     move.w    (target_count)r,d1    *&targetの引数の個数
  1239.     subq.w    #1,d1            *&targetの引数の個数-1
  1240. load_suffix_loop::
  1241.     moveq.l    #0,d0
  1242.     move.b    (a2)+,d0        *スキャンコード
  1243.     sub.b    2+44(a1),d0        *何番目のデータか
  1244.     moveq.l    #0,d2
  1245.     move.b    2+44+2(a1),d2        *1データのサイズの最大値
  1246.     cmp.w    #1,d2
  1247.     beq    load_suffix_not_mul    *1データが1バイト
  1248.     mulu.w    d2,d0
  1249. load_suffix_not_mul::
  1250.     lea.l    2+44+3(a1,d0.w),a3    *書き込む位置
  1251.     lea.l    (assign_temp)r,a0    *&suffixの引数の並び
  1252.     move.w    d3,d0            *引数の個数
  1253.     sub.w    d0,d2            *残りの長さ
  1254.     subq.w    #1,d0            *引数の個数-1
  1255. load_suffix_copy::
  1256.     move.b    (a0)+,(a3)+        *スキャンコードをコピーする
  1257.     dbra    d0,load_suffix_copy
  1258.     subq.w    #1,d2            *残りの長さ-1
  1259.     bcs    load_suffix_not_rest
  1260. load_suffix_rest::
  1261.     st.b    (a3)+            *残りを$FFで充填する
  1262.     dbra    d2,load_suffix_rest
  1263. load_suffix_not_rest::
  1264.     dbra    d1,load_suffix_loop
  1265.     movea.l    (sp)+,a3        *ワークに使ったので復元
  1266. *新しいテーブルをテーブルの並びの先頭に追加する
  1267.     move.w    (suffix_table_temp)r,d1    *データ部分のサイズ
  1268.     moveq.l    #M_TOO_MANY_SUFFIX,d3
  1269.     lea.l    suffix_table_work,a0    *ワークの先頭
  1270.     lea.l    suffix_table_work_end-suffix_table_work(a0),a2    *ワークの上限
  1271.     bsr    shift_forward        *テーブルを後ろにずらす
  1272.     bmi    load_line_err        *テーブルの領域が溢れた
  1273.     lea.l    (suffix_table_temp)r,a1
  1274.     bsr    duplicate_table        *先頭に書き込む
  1275.     bra    load_line_loop
  1276.  
  1277. ********************************
  1278. *&assign,&prefix,&suffixの引数の読み取り
  1279. *  結果はassign_tempに残ります。
  1280. *<a0.l:2ワード目
  1281. *>d3.l:エラーなし=引数の個数/エラーあり=不定
  1282. *>d4.l:エラーなし=0/エラーあり=エラーコード
  1283. *>n:エラーなし=0/エラーあり=1
  1284. *?d0-d2/d4/a0-a2
  1285. assign_sub::
  1286.     moveq.l    #M_MISSING_PARAMETER,d4
  1287.     moveq.l    #0,d0
  1288.     move.b    (a0),d0            *長さ
  1289.     beq    assign_sub_err        *引数が足りない
  1290.     lea.l    (assign_temp)r,a2
  1291.     moveq.l    #0,d3            *引数の個数
  1292. assign_sub_loop::
  1293.     addq.w    #1,d3
  1294.     moveq.l    #M_TOO_MANY_PARAMETERS,d4
  1295.     cmp.w    #32,d3
  1296.     bhi    assign_sub_err        *引数が多すぎる
  1297.     moveq.l    #0,d1            *=1(デフォルト)
  1298.     lea.l    1(a0,d0.w),a1        *次の引数の位置
  1299.     cmpi.b    #'=',-2(a1)
  1300.     bne    assign_sub_no_equal
  1301.     cmpi.b    #'1',-1(a1)
  1302.     beq    assign_sub_one        *=1
  1303.     cmpi.b    #'0',-1(a1)
  1304.     bne    assign_sub_no_equal    *{=0|=1}がない
  1305.     moveq.l    #$80,d1            *=0
  1306. assign_sub_one::
  1307.     subq.b    #2,(a0)            *2文字短くする
  1308. assign_sub_no_equal::
  1309.     moveq.l    #M_UNDEFINED_NAME,d4
  1310.     bsr    name_search        *キーコードを得る
  1311.     bmi    assign_sub_err
  1312.     bsr    code_to_scan        *スキャンコードに変換する
  1313.     bmi    assign_sub_err
  1314.     or.b    d1,d0            *=0のとき$80を加える
  1315.     move.b    d0,(a2)+        *スキャンコードを記録する
  1316.     movea.l    a1,a0            *次の位置
  1317.     moveq.l    #0,d0
  1318.     move.b    (a0),d0
  1319.     bne    assign_sub_loop        *まだ引数がある
  1320.     moveq.l    #0,d4
  1321. assign_sub_err::
  1322.     tst.l    d4
  1323.     rts
  1324.  
  1325. ********************************
  1326. *&code キーコード …
  1327. *<a0.l:2ワード目
  1328. load_com_code::
  1329. load_code::
  1330.     moveq.l    #M_RULE_NOT_BINDED,d4
  1331.     tst.b    (rule_set)r
  1332.     beq    load_line_err        *&ruleが設定されていない
  1333.     moveq.l    #M_TARGET_NOT_BINDED,d4
  1334.     move.w    (target_count)r,d1    *設定するデータ数
  1335.     beq    load_line_err        *&targetが設定されていない
  1336.     lea.l    (code_temp)r,a1
  1337.     subq.w    #1,d1
  1338. load_code_scan::
  1339.     moveq.l    #M_MISSING_PARAMETER,d4
  1340.     tst.b    (a0)
  1341.     beq    load_line_err        *引数が足りない
  1342.     moveq.l    #M_UNDEFINED_NAME,d4
  1343.     bsr    name_search        *キーコードを得る
  1344.     bmi    load_line_err
  1345.     bsr    code_to_scan        *スキャンコードに変換する
  1346.     bmi    load_line_err
  1347.     move.b    d0,(a1)+        *スキャンコードを書き込む
  1348.     dbra    d1,load_code_scan
  1349.     moveq.l    #M_TOO_MANY_PARAMETERS,d4
  1350.     tst.b    (a0)
  1351.     bne    load_line_err        *引数が多すぎる
  1352. *キーを押したときと離したときの2回分実行
  1353.     clr.b    (code_mode)r
  1354. load_code_mode::
  1355. *既に存在するテーブルのルールと一致するか確かめる
  1356.     lea.l    assign_table_work,a1
  1357.     bra    load_code_search
  1358.  
  1359. load_code_retry::
  1360.     move.w    (a1),d0
  1361.     lea.l    2+44(a1,d0.w),a1    *次のテーブル
  1362. load_code_search::
  1363.     bsr    rule_search
  1364.     lea.l    -2-44(a1),a1
  1365.     bne    load_code_new        *同じルールのテーブルは存在しない
  1366.     move.b    (code_mode)r,d0        *1回目=$00,2回目=$80
  1367.     move.b    2+44(a1),d1        *テーブルにあるスキャンコード
  1368.     eor.b    d0,d1
  1369.     bmi    load_code_retry        *スキャンコードの符号が違う
  1370. *テーブルを作り直す
  1371. *<a1.l:元のテーブルの先頭
  1372.     lea.l    (assign_table_temp)r,a0    *テーブルの先頭
  1373.     move.b    (target_min)r,d1    *スキャンコードの最小値
  1374.     or.b    (code_mode)r,d1
  1375.     move.b    (target_max)r,d2    *スキャンコードの最小値
  1376.     or.b    (code_mode)r,d2
  1377.     moveq.l    #1,d3            *1データのサイズ
  1378.     bsr    copy_xtbl        *テーブルを拡張しながらコピーする
  1379.     bsr    erase_table        *テーブルを削除する
  1380.     moveq.l    #0,d3
  1381.     move.b    (assign_table_temp+2+44+2)r,d3    *新しい1データのサイズの最大値
  1382. *<d3.w:新しい1データのサイズの最大値
  1383.     bra    load_code_expand
  1384.  
  1385. *新しいテーブルを作る
  1386. load_code_new::
  1387.     lea.l    (assign_table_temp)r,a0    *テーブルの先頭
  1388.     lea.l    (rule_work)r,a1        *ルールの先頭
  1389.     move.b    (target_min)r,d1    *スキャンコードの最小値
  1390.     or.b    (code_mode)r,d1
  1391.     move.b    (target_max)r,d2    *スキャンコードの最小値
  1392.     or.b    (code_mode)r,d2
  1393.     moveq.l    #1,d3            *1データのサイズ
  1394.     bsr    make_xtbl        *新しいコード変換テーブルを作る
  1395. *引数をテーブルに書き込む
  1396. *<d3.w:新しい1データのサイズの最大値
  1397. load_code_expand::
  1398.     move.l    a3,-(sp)        *ワークに使うため保護
  1399.     lea.l    (code_temp)r,a0        *&codeの引数の並び
  1400.     lea.l    (assign_table_temp)r,a1    *テーブルの先頭
  1401.     lea.l    (target_work)r,a2    *&targetの引数の並び
  1402.     move.w    (target_count)r,d1    *&targetの引数の個数
  1403.     subq.w    #1,d1            *&targetの引数の個数-1
  1404. load_code_loop::
  1405.     moveq.l    #0,d0
  1406.     move.b    (a2)+,d0        *スキャンコード
  1407.     or.b    (code_mode)r,d0
  1408.     sub.b    2+44(a1),d0        *何番目のデータか
  1409.     cmp.w    #1,d3
  1410.     beq    load_code_not_mul    *1データが1バイト
  1411.     mulu.w    d3,d0
  1412. load_code_not_mul::
  1413.     lea.l    2+44+3(a1,d0.w),a3    *書き込む位置
  1414.     move.b    (a0)+,d0        *&codeの引数
  1415.     or.b    (code_mode)r,d0
  1416.     move.b    d0,(a3)+        *1バイト書き込む
  1417.     move.w    d3,d0
  1418.     subq.w    #2,d0
  1419.     bcs    load_code_next        *1データが1バイト
  1420. load_code_rest::
  1421.     st.b    (a3)+            *残りを$FFで充填する
  1422.     dbra    d0,load_code_rest
  1423. load_code_next::
  1424.     dbra    d1,load_code_loop
  1425.     movea.l    (sp)+,a3        *ワークに使ったので復元
  1426. *新しいテーブルをテーブルの並びの先頭に追加する
  1427.     move.w    (assign_table_temp)r,d1    *データ部分のサイズ
  1428.     moveq.l    #M_TOO_MANY_CODE,d3
  1429.     lea.l    assign_table_work,a0    *ワークの先頭
  1430.     lea.l    assign_table_work_end-assign_table_work(a0),a2    *ワークの上限
  1431.     bsr    shift_forward        *テーブルを後ろにずらす
  1432.     bmi    load_line_err        *テーブルの領域が溢れた
  1433.     lea.l    (assign_table_temp)r,a1
  1434.     bsr    duplicate_table        *先頭に書き込む
  1435. *離したときの分も作る
  1436.     tas.b    (code_mode)r
  1437.     bpl    load_code_mode        *$00なら$80にして2回目を実行
  1438.     bra    load_line_loop
  1439.  
  1440. ********************************
  1441. *&ask パッチネーム{=0|[=1]} …
  1442. *<a0.l:2ワード目
  1443. load_com_ask::
  1444. load_ask::
  1445.     lea.l    (load_com_ask_names)r,a1
  1446.     move.l    (ask_flag_bits_work)r,d1
  1447.     moveq.l    #M_MISSING_PARAMETER,d4
  1448.     moveq.l    #0,d0
  1449.     move.b    (a0),d0            *ワードの長さ
  1450.     beq    load_line_err
  1451. load_ask_loop::
  1452.     moveq.l    #1,d2            *=1(デフォルト)
  1453.     lea.l    1(a0,d0.w),a2        *次の引数の位置
  1454.     cmpi.b    #'=',-2(a2)
  1455.     bne    load_ask_no_equal
  1456.     cmpi.b    #'1',-1(a2)
  1457.     beq    load_ask_one        *=1
  1458.     cmpi.b    #'0',-1(a2)
  1459.     bne    load_ask_no_equal    *{=0|=1}がない
  1460.     moveq.l    #0,d2            *=0
  1461. load_ask_one::
  1462.     subq.b    #2,(a0)            *2文字短くする
  1463. load_ask_no_equal::
  1464.     moveq.l    #M_UNKNOWN_PACH_NAME,d4
  1465.     bsr    word_search        *パッチネームを番号に変換
  1466.     bmi    load_line_err
  1467.     bset.l    d0,d1            *対応するビットをセット
  1468.     tst.l    d2
  1469.     bne    load_ask_next
  1470.     bclr.l    d0,d1            *対応するビットをリセット
  1471. load_ask_next::
  1472.     movea.l    a2,a0            *次の位置
  1473.     moveq.l    #0,d0
  1474.     move.b    (a0),d0            *ワードの長さ
  1475.     bne    load_ask_loop        *まだ引数がある
  1476.     move.l    d1,(ask_flag_bits_work)r    *フラグに設定
  1477.     bra    load_line_loop
  1478.  
  1479. *パッチネームリスト
  1480. load_com_ask_names::
  1481. *        文字数,文字列,番号
  1482.     .dc.b    4,'auto',5
  1483.     .dc.b    3,'ins',7
  1484.     .dc.b    3,'led',6
  1485.     .dc.b    4,'lock',1
  1486.     .dc.b    3,'n-n',8
  1487.     .dc.b    5,'space',3
  1488.     .dc.b    3,'tsu',2
  1489.     .dc.b    5,'tsu-n',9
  1490.     .dc.b    3,'xf1',11
  1491.     .dc.b    7,'zenkaku',4
  1492.     .dc.b    0
  1493.     .even
  1494.  
  1495. ********************************
  1496. *&click 
  1497. *<a0.l:2ワード目
  1498. load_com_click::
  1499.     bra    load_line_loop
  1500.  
  1501. ********************************
  1502. *&full 
  1503. *<a0.l:2ワード目
  1504. load_com_full::
  1505.     bra    load_line_loop
  1506.  
  1507. ********************************
  1508. *&hide
  1509. *<a0.l:2ワード目
  1510. load_com_hide::
  1511.     bra    load_line_loop
  1512.  
  1513. ********************************
  1514. *&meta [スキャンコード]{メタ文字} ルール
  1515. *<a0.l:2ワード目
  1516. load_com_meta::
  1517.     moveq.l    #M_MISSING_PARAMETER,d4
  1518.     move.b    (a0)+,d0        *メタ文字のバイト数
  1519.     beq    load_line_err
  1520.     moveq.l    #M_ILLEGAL_META_CHAR,d4
  1521.     moveq.l    #0,d2            *メタ文字の上位バイトをクリア
  1522.     subq.b    #1,d0
  1523.     beq    load_com_meta_1        *スキャンコードが省略された
  1524.     subq.b    #1,d0
  1525.     bne    load_line_err
  1526.     move.b    (a0)+,d2        *スキャンコードの指定
  1527.     lsl.w    #8,d2
  1528. load_com_meta_1::
  1529.     move.b    (a0)+,d2        *メタ文字の指定
  1530.     lea.l    (rule_temp)r,a1        *ルールのビット展開領域
  1531.     bsr    load_rule        *ルールを読み取る
  1532.     bmi    load_line_err
  1533.     lea.l    meta_table_work,a0    *テーブルのワーク
  1534.     bsr    temp_search        *ルールが同じテーブルを探す
  1535.     bne    load_com_meta_new    *同じテーブルがない
  1536.     move.w    d2,2+44(a0)        *メタ文字を上書きする
  1537.     bra    load_line_loop
  1538.  
  1539. *ルールが違うので別に登録する
  1540. *<d2.w:メタコード
  1541. load_com_meta_new::
  1542.     lea.l    meta_table_work,a0    *テーブルのワーク
  1543.     lea.l    meta_table_work_end-meta_table_work(a0),a2
  1544.     bsr    get_table_size
  1545.     move.w    d0,d1
  1546.     add.w    d1,d1
  1547.     lea.l    2(a0,d1.w),a0        *エンドコードの次のアドレス
  1548.     lea.l    2+44+2(a0),a1
  1549.     moveq.l    #M_TOO_MANY_META,d4
  1550.     cmpa.l    a2,a1
  1551.     bhi    load_line_err        *テーブルが溢れた
  1552. load_com_meta_shift::
  1553.     move.w    -(a0),-(a1)        *登録済みのテーブルを後ろにずらす
  1554.     dbra    d0,load_com_meta_shift
  1555.     move.w    #2,(a0)+        *定数
  1556.     lea.l    (rule_temp)r,a1
  1557.     moveq.l    #44/4-1,d0
  1558. @@:    move.l    (a1)+,(a0)+        *ルールを設定
  1559.     dbra    d0,@b
  1560.     move.w    d2,(a0)+        *メタコード
  1561.     bra    load_line_loop
  1562.  
  1563. ********************************
  1564. *&prog ファイル名 …
  1565. *<a0.l:2ワード目
  1566. load_com_prog::
  1567.     moveq.l    #M_MISSING_PARAMETER,d4
  1568.     tst.b    (a0)
  1569.     beq    load_line_err        *引数が足りない
  1570. load_com_prog_loop::
  1571.     bsr    search_prog        *プログラムの番号を得る
  1572.     bmi    load_line_err
  1573.     tst.b    (a1)
  1574.     bne    load_com_prog_next    *既に登録されているので次のファイル名へ
  1575.     moveq.l    #M_TOO_MANY_PROGRAMS,d4
  1576.     cmp.w    #31,d0
  1577.     beq    load_line_err        *プログラム登録が多すぎる
  1578.     movem.l    (prog_table_temp)r,d0-d4/a2
  1579.     movem.l    d0-d4/a2,(a1)        *ファイル名を登録する
  1580.     clr.w    24(a1)            *次のエンドコード
  1581. load_com_prog_next::
  1582.     tst.b    (a0)            *次の文字数
  1583.     bne    load_com_prog_loop    *次のファイル名へ
  1584.     bra    load_line_loop
  1585.  
  1586. ********************************
  1587. *ファイルエンド
  1588. load_eof::
  1589. *クローズ
  1590.     move.w    d7,-(sp)
  1591.     DOS    _CLOSE
  1592.     addq.w    #2,sp
  1593. *エラーがなければ次のファイルへ
  1594.     tst.w    d5            *エラーカウンタ
  1595.     bne    load_eof_err        *エラーがあった
  1596.     movea.l    (next_name_ptr)r,a2    *次の環境定義ファイル名のアドレス
  1597.     tst.b    (a2)
  1598.     bne    load_file_loop        *次のファイルへ
  1599. *テーブルのアドレスを設定する
  1600.     lea.l    prefix_table_work,a0
  1601.     move.l    a0,(prefix_table)r
  1602.     lea.l    assign_table_work,a0
  1603.     move.l    a0,(assign_table)r
  1604.     lea.l    suffix_table_work,a0
  1605.     move.l    a0,(suffix_table)r
  1606.     lea.l    char_table_work,a0
  1607.     move.l    a0,(char_table)r
  1608.     lea.l    meta_table_work,a0
  1609.     move.l    a0,(meta_table)r
  1610.     lea.l    (prog_table_work)r,a0
  1611.     move.l    a0,(prog_table)r
  1612.     lea.l    break_table_work,a0
  1613.     move.l    a0,(break_table)r
  1614.     lea.l    copy_table_work,a0
  1615.     move.l    a0,(copy_table)r
  1616.     lea.l    den_table_work,a0
  1617.     move.l    a0,(den_table)r
  1618.     lea.l    int_table_work,a0
  1619.     move.l    a0,(int_table)r
  1620.     lea.l    lock_table_work,a0
  1621.     move.l    a0,(lock_table)r
  1622.     lea.l    reset_table_work,a0
  1623.     move.l    a0,(reset_table)r
  1624.     lea.l    sbreak_table_work,a0
  1625.     move.l    a0,(sbreak_table)r
  1626.     lea.l    unlock_table_work,a0
  1627.     move.l    a0,(unlock_table)r
  1628. *環境定義ファイルの読み込み終わり
  1629.     moveq.l    #0,d4            *エラーなし
  1630.     rts
  1631.  
  1632. *エラーがあった
  1633. load_eof_err::
  1634.     moveq.l    #M_ENVIRONMENT_ERROR,d4
  1635.     rts
  1636.  
  1637. ********************************
  1638. *エラーメッセージ表示
  1639. *<d4.w:メッセージの番号
  1640. *<d5.w:エラーカウンタ
  1641. *<d6.w:次の行の行番号
  1642. *>d5.w:エラーカウンタ
  1643. *?d0/a0
  1644. load_line_err::
  1645.     subq.w    #1,d6            *行番号を修正する
  1646.     bsr    write_line_message
  1647.     addq.w    #1,d6            *行番号を元に戻す
  1648. *次の行へ
  1649.     bra    load_line_loop
  1650.  
  1651. *オープンできない
  1652. load_opn_err::
  1653. *<a3.l:ファイル名のアドレス
  1654.     movea.l    a3,a0
  1655.     bsr    write_string
  1656.     moveq.l    #M_CANNOT_OPEN,d4
  1657.     rts
  1658.  
  1659. ********************************
  1660. *ルールを読み取る
  1661. *  ルールのフォーマットは、{キーコード|キーネーム}{=0|[=1]} …。
  1662. *<a0.l:2ワード目
  1663. *<a1.l:ビット展開領域のアドレス
  1664. *>d4.l:エラーなし=0/あり=メッセージの番号
  1665. *z:エラーあり=0/なし=1
  1666. *?d4
  1667. load_rule::
  1668.     movem.l    d0-d3/a0-a3,-(sp)
  1669.     movea.l    a1,a3
  1670.     moveq.l    #0,d0
  1671.  .rept 44/4
  1672.     move.l    d0,(a1)+
  1673.  .endm
  1674.     bra    load_rule_cont
  1675.  
  1676. load_rule_loop::
  1677.     moveq.l    #0,d1
  1678.     moveq.l    #0,d2
  1679.     subq.w    #2,d0
  1680.     ble    load_rule_one        *=0または=1がない
  1681.     cmpi.b    #'=',1(a0,d0.w)
  1682.     bne    load_rule_one        *=がない
  1683.     moveq.l    #-'1',d3
  1684.     add.b    1+1(a0,d0.w),d3
  1685.     beq    load_rule_one_on    *=1
  1686.     addq.b    #'1'-'0',d3
  1687.     bne    load_rule_one        *=0または=1がない
  1688.     moveq.l    #18+4,d2        *=0の場合のオフセット
  1689. load_rule_one_on::
  1690.     move.b    d0,(a0)            *2文字短くする
  1691.     moveq.l    #2,d1
  1692. load_rule_one::
  1693.     movea.l    a0,a2
  1694.     bsr    name_search
  1695.     bmi    load_rule_undef_key    *未定義のキーネーム
  1696.     adda.w    d1,a0            *=0または=1の分を補正する
  1697.     move.w    d0,d3
  1698.     lsr.w    #3,d3
  1699.     add.w    d2,d3            *=0の場合はアドレスに18+4加える
  1700.     bset.b    d0,(a3,d3.w)
  1701.     bra    load_rule_cont
  1702.  
  1703. load_rule_undef_key::
  1704.     movea.l    a2,a0
  1705.     bsr    search_prog
  1706.     bmi    load_rule_failed    *未定義のプログラム
  1707.     tst.b    (a1)
  1708.     beq    load_rule_failed    *未定義のプログラム
  1709.     adda.w    d1,a0            *=0または=1の分を補正する
  1710.     moveq.l    #0,d3
  1711.     bset.l    d0,d3            *該当するビットを立てる
  1712.     or.l    d3,18(a3,d2.w)        *=0の場合はアドレスに18+4加える
  1713. load_rule_cont::
  1714.     moveq.l    #0,d4
  1715.     moveq.l    #0,d0
  1716.     move.b    (a0),d0
  1717.     bne    load_rule_loop
  1718. load_rule_end::
  1719.     movem.l    (sp)+,d0-d3/a0-a3
  1720.     tst.l    d4
  1721.     rts
  1722.  
  1723. load_rule_failed::
  1724.     moveq.l    #M_UNDEFINED_NAME,d4
  1725.     bra    load_rule_end
  1726.  
  1727. ********************************
  1728. *キーネームをキーコードに変換する
  1729. *  見つからないとき 16 進数 2 桁として認識できればその値を返します。
  1730. *<a0.l:ワードのアドレス(長さ,文字列)
  1731. *>d0.l:番号(見つかった>=0/見つからない<0)
  1732. *>a0.l:ワードの次のアドレス(見つからなければ不定)
  1733. *>n:見つかった=0/見つからない=1
  1734. *?d0/a0
  1735. name_search::
  1736.     move.l    a1,-(sp)
  1737.     lea.l    (name_work)r,a1
  1738.     cmpi.b    #2,(a0)
  1739.     beq    name_search_two        *2文字ならば16進数もチェック
  1740.     bsr    word_search
  1741.     movea.l    (sp)+,a1
  1742.     rts
  1743.  
  1744. name_search_two::
  1745.     bsr    word_search
  1746.     bpl    name_search_end        *キーネームが見つかった
  1747.     bsr    chrhex2            *16進数に変換してみる
  1748.     ext.l    d0
  1749.     bmi    name_search_end        *16進数でもない
  1750.     cmp.b    #$90,d0
  1751.     blo    name_search_end        *$00~$8F
  1752.     moveq.l    #-1,d0            *$90~$FF
  1753. name_search_end::
  1754.     tst.l    d0
  1755.     movea.l    (sp)+,a1
  1756.     rts
  1757.  
  1758. ********************************
  1759. *キーコードをスキャンコードに変換する
  1760. *  キーコードが$80~$86,$88~$8B,$8Fならば$5A~$60,$70~$74に変換します。
  1761. *<d0.b:キーコード
  1762. *>d0.l:スキャンコード
  1763. *>n:エラーあり=1,エラーなし=0
  1764. *?d0
  1765. code_to_scan::
  1766.     ext.w    d0
  1767.     bpl    code_to_scan_end
  1768.     sub.w    #$FF80,d0
  1769.     cmp.w    #$008F-$0080,d0
  1770.     bhi    code_to_scan_err
  1771.     move.b    code_to_scan_tbl(pc,d0.w),d0
  1772.     ext.w    d0
  1773. code_to_scan_end::
  1774.     ext.l    d0
  1775.     rts
  1776.  
  1777. code_to_scan_err::
  1778.     moveq.l    #-1,d0
  1779.     rts
  1780.  
  1781. code_to_scan_tbl::
  1782.     .dc.b    $5A,$5B,$5C,$5D,$5E,$5F,$60,$FF
  1783.     .dc.b    $70,$71,$72,$73,$FF,$FF,$FF,$74
  1784.  
  1785. ********************************
  1786. *ワードの番号を求める
  1787. *<a0.l:ワードのアドレス(長さ,文字列)
  1788. *<a1.l:辞書のアドレス(長さ,文字列,番号,…,0)
  1789. *>d0.l:番号(見つかった>=0/見つからない<0)
  1790. *>a0.l:ワードの次のアドレス(見つからなければ文字列の先頭アドレス)
  1791. *>n:見つかった=0/見つからない=1
  1792. *?d0/a0
  1793. word_search::
  1794.     movem.l    d1-d2/a1-a3,-(sp)
  1795.     moveq.l    #0,d0
  1796.     moveq.l    #0,d1
  1797.     move.b    (a0)+,d0        *ワードの長さ
  1798.     move.b    (a1)+,d1
  1799. word_search_loop::
  1800.     cmp.b    d0,d1
  1801.     bne    word_search_next    *長さが一致しない
  1802.     movea.l    a0,a2
  1803.     movea.l    a1,a3
  1804.     move.w    d0,d2
  1805.     subq.w    #1,d2
  1806. word_search_cmp::
  1807.     cmpm.b    (a2)+,(a3)+        *比較
  1808.     dbne    d2,word_search_cmp
  1809.     beq    word_search_fnd        *見つかった
  1810. *次のワードへ
  1811. word_search_next::
  1812.     lea.l    1(a1,d1.w),a1
  1813.     move.b    (a1)+,d1
  1814.     bne    word_search_loop    *次のワードへ
  1815. *見つからない
  1816. word_search_not::
  1817.     moveq.l    #-1,d0
  1818.     bra    word_search_end
  1819.  
  1820. *見つかった
  1821. word_search_fnd::
  1822.     move.b    (a3),d0            *番号
  1823.     movea.l    a2,a0            *ワードの直後
  1824.     tst.l    d0
  1825. word_search_end::
  1826.     movem.l    (sp)+,d1-d2/a1-a3
  1827.     rts
  1828.  
  1829. ********************************
  1830. *&ruleと同じルールのテーブルが既に存在するか調べる
  1831. *<a1.l:テーブルの並びの先頭アドレス
  1832. *>a1.l:見つかった=データ部分の先頭アドレス/見つからなかった=不定
  1833. *>z:見つかった=1/見つからなかった=0
  1834. *?d0
  1835. rule_search::
  1836.     movem.l    d1/a0/a2,-(sp)
  1837.     bra    rule_search_start
  1838.  
  1839. rule_search_loop::
  1840.     lea.l    44(a2,d0.w),a1        *次のテーブルへ
  1841. rule_search_start::
  1842.     move.w    (a1)+,d0        *データサイズ
  1843.     bmi    rule_search_failed    *見つからなかった
  1844.     lea.l    (rule_work)r,a0        *&ruleの設定
  1845.     movea.l    a1,a2
  1846.  .rept 44/4
  1847.     cmpm.l    (a0)+,(a1)+        *ルールを比較する
  1848.     bne    rule_search_loop
  1849.  .endm
  1850.     movem.l    (sp)+,d1/a0/a2
  1851.     rts
  1852.  
  1853. rule_search_failed::
  1854.     moveq.l    #1,d0            *見つからなかった
  1855.     movem.l    (sp)+,d1/a0/a2
  1856.     rts
  1857.  
  1858. ********************************
  1859. *ルールが同じテーブルを探す
  1860. *<a0.l:テーブルのワーク
  1861. *<a1.l:ルール
  1862. *>a0.l:見つかった=テーブルの先頭/見つからなかった=不定
  1863. *>z:見つかった=1/見つからなかった=0
  1864. *?d0/a0
  1865. temp_search::
  1866.     movem.l    a1-a3,-(sp)
  1867.     bra    temp_search_start
  1868.  
  1869. temp_search_loop::
  1870.     lea.l    2+44(a0,d0.w),a0    *次のテーブルへ
  1871. temp_search_start::
  1872.     move.w    (a0),d0            *サイズ
  1873.     bmi    temp_search_end        *見つからなかった
  1874.     lea.l    2(a0),a2        *ルール
  1875.     movea.l    a1,a3
  1876.  .rept 44/4
  1877.     cmpm.l    (a2)+,(a3)+        *ルールを比較する
  1878.     bne    temp_search_loop
  1879.  .endm
  1880. temp_search_end::
  1881.     movem.l    (sp)+,a1-a3
  1882.     rts
  1883.  
  1884. ********************************
  1885. *プログラムの条件が同じテーブルを探す
  1886. *<a0.l:テーブルのワーク
  1887. *<a1.l:ルール
  1888. *>a0.l:見つかった=テーブルの先頭/見つからなかった=不定
  1889. *>z:見つかった=1/見つからなかった=0
  1890. *?d0/a0
  1891. rule_prog_search_loop::
  1892.     move.w    (a0),d0
  1893.     lea.l    2+44(a0,d0.w),a0    *次のテーブルへ
  1894. rule_prog_search::
  1895.     tst.w    (a0)            *サイズ
  1896.     bmi    rule_prog_search_end    *見つからなかった
  1897.     move.l    2+18(a0),d0
  1898.     cmp.l    18(a1),d0
  1899.     bne    rule_prog_search_loop    *一致しない
  1900.     move.l    2+18+4+18(a0),d0
  1901.     cmp.l    18+4+18(a1),d0
  1902.     bne    rule_prog_search_loop    *一致しない
  1903. rule_prog_search_end::
  1904.     rts
  1905.  
  1906. ********************************
  1907. *プログラムの番号を得る
  1908. *  文字列を 24 バイト詰めにした結果は prog_table_temp に残る。
  1909. *<a0.l:文字数のアドレス(文字数>0)
  1910. *<a1.l:ファイル名のテーブル
  1911. *>d0.l:プログラムの番号(31なら追加できない)
  1912. *>d4.l:エラーコード
  1913. *>a0.l:次の文字列のアドレス
  1914. *>a1.l:見つかった=見つかった位置/見つからなかった=次の空きのアドレス
  1915. *n:エラーあり=1/エラーなし=0
  1916. *?d0/d3-d4/a0-a2
  1917. search_prog::
  1918.     moveq.l    #0,d0
  1919.     move.b    (a0)+,d0
  1920.     moveq.l    #M_TOO_LONG_FILE_NAME,d4
  1921.     cmp.w    #23,d0
  1922.     bhi    search_prog_end        *ファイル名が長すぎる
  1923.     moveq.l    #0,d4            *エラーコード
  1924.     lea.l    (prog_table_temp)r,a1
  1925.  .rept 24/4
  1926.     move.l    d4,(a1)+        *ファイル名を小文字化するワーク
  1927.  .endm
  1928.     movem.l    d1-d2/a3-a4,-(sp)
  1929.     lea.l    (a0,d0.w),a4        *次の文字数のアドレス
  1930.     move.b    (a4),d1
  1931.     clr.b    (a4)            *一時的なエンドコード
  1932.     lea.l    (prog_table_temp)r,a1
  1933.     bsr    to_lower        *小文字化する
  1934.     move.b    d1,(a4)
  1935.     lea.l    (prog_table_temp)r,a0    *文字列
  1936.     lea.l    (prog_table_work)r,a1    *ファイル名のテーブル
  1937.     moveq.l    #0,d0            *プログラムの番号
  1938.     move.w    (a0)+,d1        *先頭2バイト
  1939.     move.w    (a1)+,d2        *最初のファイル名の先頭2バイト
  1940.     beq    search_prog_undef    *プログラムが定義されていない
  1941. search_prog_loop::
  1942.     cmp.w    d1,d2            *先頭2バイトを比較
  1943.     bne    search_prog_next    *一致しないので次のファイル名へ
  1944.     movea.l    a0,a2            *探すファイル名の先頭+2
  1945.     movea.l    a1,a3            *定義されたファイル名の先頭+2
  1946.  .rept (24-2-2)/4
  1947.     cmpm.l    (a2)+,(a3)+        *残りは4バイトずつ比較
  1948.     bne    search_prog_next    *一致しないので次のファイル名へ
  1949.  .endm
  1950.     cmpm.w    (a2)+,(a3)+        *最後の2バイトを比較
  1951.     beq    search_prog_found    *見つかった
  1952. search_prog_next::
  1953.     lea.l    24-2(a1),a1        *次のファイル名
  1954.     addq.w    #1,d0            *次のプログラムの番号
  1955.     move.w    (a1)+,d2        *次のファイル名の先頭2バイト
  1956.     bne    search_prog_loop    *次のファイルへ
  1957. search_prog_undef::
  1958. search_prog_found::
  1959.     subq.w    #2,a1            *ファイル名の先頭
  1960.     movea.l    a4,a0            *次の文字数のアドレス
  1961.     movem.l    (sp)+,d1-d2/a3-a4
  1962. search_prog_end::
  1963.     tst.l    d4
  1964.     rts
  1965.  
  1966. ********************************
  1967. *デフォルトの環境定義ファイル名
  1968. *  起動したプログラムと同じパスが付加されます。
  1969. *  デフォルトの環境定義ファイル名は 1 つだけですが、エンドコードが必要です。
  1970. default_env_name::
  1971.     .dc.b    'KeyWitch.env',0
  1972.     .dc.b    0            *環境定義ファイル名の並びの終わり
  1973.  
  1974. ********************************
  1975. *環境定義ファイルを検索するパスを指定する環境変数名
  1976. env_var_name::
  1977.     .dc.b    'KEYWITCH',0
  1978.     .even
  1979.  
  1980.     .bss
  1981.     .even
  1982.  
  1983. ********************************
  1984. *ワークエリア
  1985. env_name_work::
  1986.     .ds.b    256            *環境定義ファイル名
  1987. next_name_ptr::
  1988.     .ds.l    1            *次の環境定義ファイル名のアドレス
  1989. rdc_work::
  1990.     .ds.w    2
  1991.     .ds.b    1024+2            *ファイル読み込みバッファ
  1992. rds_work::
  1993.     .ds.b    1024            *1行読み込みワーク
  1994. rule_set::
  1995.     .ds.b    1            *&ruleが設定された=-1
  1996.     .even
  1997. ask_flag_bits_work::
  1998.     .ds.l    1            *&askのワーク
  1999. rule_work::
  2000.     .ds.b    44            *&ruleのワーク
  2001. rule_temp::
  2002.     .ds.b    44            *ルールのワーク
  2003. assign_temp::
  2004.     .ds.b    32            *&assign,&prefix,&suffixの引数のワーク
  2005. target_count::
  2006.     .ds.w    1            *&targetの長さ
  2007. target_work::
  2008.     .ds.b    128            *&targetのワーク
  2009. target_mark::
  2010.     .ds.w    128/2            *&targetの二重定義チェックフラグ
  2011. target_min::
  2012.     .ds.b    1            *&targetの最小値
  2013. target_max::
  2014.     .ds.b    1            *&targetの最大値
  2015. last_name_tail::
  2016.     .ds.l    1            *キーネームの並びの末尾
  2017. name_work::
  2018.     .ds.b    1024            *キーネームのワーク
  2019. name_work_tail::
  2020. *
  2021. prog_table_work::
  2022.     .ds.b    24*31+2
  2023. prog_table_work_end::
  2024. live_repeat_bits_work::
  2025.     .ds.b    16
  2026. kill_repeat_bits_work::
  2027.     .ds.b    16
  2028. led_map_work::
  2029.     .ds.b    7
  2030. joy1_map_work::
  2031.     .ds.b    8
  2032. joy2_map_work::
  2033.     .ds.b    8
  2034. *
  2035. code_mode::
  2036.     .ds.b    1            *&code用ワーク,1回目=$00,2回目=$80
  2037.     .even
  2038. *各種テーブル一時展開領域
  2039. char_table_temp::
  2040. prefix_table_temp::
  2041. assign_table_temp::
  2042. suffix_table_temp::
  2043.     .ds.b    2+44+3+32*128+1
  2044. code_temp::
  2045.     .ds.b    128
  2046. prog_table_temp::
  2047.     .ds.b    24
  2048. *以降は絶対番地でアクセスする
  2049. *各種テーブル展開領域
  2050. char_table_work::
  2051.     .ds.b    (2+44+3+128+1)*32+2
  2052. char_table_work_end::
  2053. prefix_table_work::
  2054.     .ds.b    (2+44+3+128+1)*16+2
  2055. prefix_table_work_end::
  2056. assign_table_work::
  2057.     .ds.b    (2+44+3+128+1)*16+2
  2058. assign_table_work_end::
  2059. suffix_table_work::
  2060.     .ds.b    (2+44+3+128+1)*16+2
  2061. suffix_table_work_end::
  2062. meta_table_work::
  2063.     .ds.b    (2+44+2)*32+2
  2064. meta_table_work_end::
  2065. break_table_work::
  2066.     .ds.b    (2+44)*32+2
  2067. break_table_work_end::
  2068. copy_table_work::
  2069.     .ds.b    (2+44)*32+2
  2070. copy_table_work_end::
  2071. den_table_work::
  2072.     .ds.b    (2+44)*32+2
  2073. den_table_work_end::
  2074. int_table_work::
  2075.     .ds.b    (2+44)*32+2
  2076. int_table_work_end::
  2077. lock_table_work::
  2078.     .ds.b    (2+44)*32+2
  2079. lock_table_work_end::
  2080. reset_table_work::
  2081.     .ds.b    (2+44)*32+2
  2082. reset_table_work_end::
  2083. sbreak_table_work::
  2084.     .ds.b    (2+44)*32+2
  2085. sbreak_table_work_end::
  2086. unlock_table_work::
  2087.     .ds.b    (2+44)*32+2
  2088. unlock_table_work_end::
  2089.